package cn.test.future;

import java.util.concurrent.*;

/**
 * 在维护促销活动时需要查询商品信息（包括商品基本信息、商品价格、商品库存、商品图片、商品销售状态等）。这些信息分布在不同的业务中心，由不同的系统提供服务。如果采用同步方式，假设一个接口需要50ms，那么一个商品查询下来就需要200ms-300ms，这对于我们来说是不满意的。如果使用Future改造则需要的就是最长耗时服务的接口，也就是50ms左右。
 */
public class FutureTaskTest2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> t1 = new FutureTask<>(new Task1());
        FutureTask<String> t2 = new FutureTask<>(new Task2());
        FutureTask<String> t3 = new FutureTask<>(new Task3());
        FutureTask<String> t4 = new FutureTask<>(new Task4());
        FutureTask<String> t5 = new FutureTask<>(new Task5());

        ExecutorService executor = Executors.newFixedThreadPool(5);
        executor.submit(t1);
        executor.submit(t2);
        executor.submit(t3);
        executor.submit(t4);
        executor.submit(t5);

        System.out.println(t1.get());
        System.out.println(t2.get());
        System.out.println(t3.get());
        System.out.println(t4.get());
        System.out.println(t5.get());

        executor.shutdown();
    }

    static class Task1 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("T1：查询商品基本信息...");
            TimeUnit.MILLISECONDS.sleep(50);
            return "商品基本信息查询成功";
        }
    }

    static class Task2 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("T2：查询商品价格...");
            TimeUnit.MILLISECONDS.sleep(50);
            return "商品价格查询成功";
        }
    }

    static class Task3 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("T3：查询商品库存...");
            TimeUnit.MILLISECONDS.sleep(50);
            return "商品库存查询成功";
        }
    }

    static class Task4 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("T4：查询商品图片...");
            TimeUnit.MILLISECONDS.sleep(50);
            return "商品图片查询成功";
        }
    }

    static class Task5 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("T5：查询商品销售状态...");
            TimeUnit.MILLISECONDS.sleep(50);
            return "商品销售状态查询成功";
        }
    }
}
